package com.wanghua.spring.service;

import com.wanghua.spring.bean.entity.VisitDetail;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.stereotype.Service;

import javax.security.auth.login.AccountException;

//Spring拦截器测试
@Service("aopService")
public class AopService implements IAopService {
    private String name="test!";

    @Override
    public void withAop1(String type, VisitDetail visitDetail) throws Exception {  //这里放两个参数测试下，没具体意义。
        System.out.println("有AOP的函数运行1。name: " + name);
        if (name.trim().length() == 0)
            throw new AccountException("name属性不能为空");
    }

    @Override
    public void withAop1(String type) throws Exception {  //这里放一个参数测试下，没具体意义。
        System.out.println("有AOP的函数运行2。name: " + name);
        if (name.trim().length() != 0)
            throw new AccountException("name属性不能为空");
    }

    @Override
    public String withAop1(int num) throws Exception {
        return "你好吗？";
    }

    @Override
    public void withoutAop() throws Exception {
        System.out.println("没有AOP的函数运行。");
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public static void main(String[] args) throws Exception {
        String[] locations = {"applicationContext.xml"};
        ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext(locations);
        try {
            IAopService aopService = (IAopService) context.getBean("aopService"); //JDK动态代理,必须用接口。在Spring AOP中有两种代理方式，JDK动态代理和CGLIB代理。默认情况下，TargetObject实现了接口时，则采用JDK动态代理，例如，AServiceImpl；反之，采用CGLIB代理，例如，BServiceImpl。强制使用CGLIB代理需要将 <aop:config>的 proxy-target-class属性设为true。这样才能在这里使用具体类，JDK动态代理下必须转成接口，不能用类。
            VisitDetail visitDetail = new VisitDetail();
            visitDetail.setId(1001);
            aopService.withAop1("type1", visitDetail);
            aopService.withAop1("type2");
            aopService.withAop1(1);
        } catch (Exception ex) {
            String msg =ex.getMessage();
        } finally {
            context.destroy();   // 关闭 Spring 容器，以触发 Bean 销毁方法的执行，但实际上并没有触发。
        }
    }
}
